package net.jcip.examples.chapter6.thread.ExecutorService;

import net.jcip.examples.chapter6.thread.Callable.MyCallable;
import net.jcip.examples.chapter6.thread.Runnable.ImplementsRunnable;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;


/**
 * 推荐的生产实践：不要为每个任务创建新 Thread，使用线程池复用线程（性能与资源更优）。
 * 	•	ExecutorService 的具体实现（FixedThreadPool、CachedThreadPool、ScheduledExecutorService、ThreadPoolExecutor）决定调度/队列策略。
 * 	•	submit() 会返回 Future，用于取消、查询完成状态或获取返回值。
 * 	•	要记得 shutdown() / shutdownNow() 并优雅等待终止。
 */


/**
 *
 * submit() 和execute()之间的选择 取决于具体需求。 如果我们需要获取任务结果或处理异常，则应该使用submit()。另一方面，如果我们有一个不返回结果的任务，并且我们想触发它然后就不管它了，那么execute()是正确的选择。
 *
 * 此外，如果我们处理更复杂的用例，并且需要灵活地管理任务和检索结果或异常，submit() 是更好的选择。
 */
public class MyExecutorService {


    public static void main(String[] args){
        ExecutorService pool = Executors.newFixedThreadPool(4);

        // 提交 Runnable（返回 Future<?>）
        Future<?> f1 = pool.submit(new ImplementsRunnable());


        // 提交 Callable（返回 Future<V>）
        Future<String> f2 = pool.submit(new MyCallable());

        try{
            String val = f2.get();
        }catch (Exception e){
            System.out.println(e);
        }

        pool.shutdown();
    }
}
